\section{使用\LaTeX 书写毕业论文}

估计很多同学学习\LaTeX 都是为了书写毕业论文。很多学校提供\LaTeX 格式的毕业论文模板，这种情况下使用\LaTeX 书写毕业论文无疑是又省事效果又好的选择。然而，更多的的学校并未提供毕业论文模板，而是仅仅给出了一系列格式要求，甚至格式要求还是用Word相关的术语给出的。即使在这种情况下，使用\LaTeX 书写毕业论文仍然是更加高效的选择，也更利于论文格式的规范性。下面就将介绍在没有现成模板的情况下，如何从头开始，自己手动设定格式，使用\LaTeX 书写出符合格式要求的毕业论文。

\section{\LaTeX 项目管理}

如果只需要写一篇几百到几千字的短文章，将所有内容放在同一个源文件里也许是不错的选择。然而，当你要写的东西规模越来越大，单个超大号 源文件就不是一个好选择了，因为这将带来以下缺点。

\begin{itemize}
    \item 过多的内容混杂在一起导致管理困难；
    \item 如果是一个团队分工编写一篇较长的文档，那么多人同时编辑一个文件可能会导致麻烦；
    \item 如果你使用git等版本控制系统，单个超大号源文件会导致你难以跟踪每一处更改。
\end{itemize}

因此，如同开发一个软件项目一样，在使用\LaTeX 书写较大规模的文档时，有必要将文档分为多个源文件，并采用合理的目录结构。一般来讲，在使用\LaTeX 编写大规模文档时，一般采取以下做法：

\begin{itemize}
    \item 将文档格式配置、自定义命令等放在一个自己编写的宏包内；
    \item 将文档主体结构放在一个源文件内，在这个源文件内使用命令\\
    \verb|\include{<文件名>}|或\verb|\input{<文件名>}|插入文档的具体内容；
    \item 将每一章的内容分开写在各自的源文件内；
    \item 将插图放在单独的文件夹中。根据插图数量的多少，你可以选择将整个文档的插图放在一个文件夹内，也可以将每一章的插图放在各自的文件夹内。
\end{itemize}

以下是一个\LaTeX 工程的目录结构示例。其中\verb|main.tex|为包含文档主体结构的源文件；\verb|style.sty|是用户自己编写的宏包；\verb|figures|文件夹包含所有插图；\verb|cover.tex|为封面；\verb|研究背景.tex|、\verb|理论分析.tex|、\verb|软件实现.tex|为各章节内容；\verb|源代码.tex|、\verb|测试数据.tex|为各附录内容。

\begin{tabular}{cccc}
    目录结构 & & & main.tex \\
    {
    \ttfamily
    \begin{lstlisting}[frame=none]
    figures/
    |-fig1.png
    |-fig2.png
    |-fig3.png
    main.tex
    style.sty
    cover.tex
    研究背景.tex
    理论分析.tex
    软件实现.tex
    源代码.tex
    测试数据.tex
    \end{lstlisting}
    }
    &&&
    {
    \ttfamily
    \begin{lstlisting}[frame=none]
\documentclass{article}
\usepackage{style}
% 导言区的其他内容
\begin{document}
    \include{cover.tex}
    \newpage
    \tableofcontents
    \include{研究背景.tex}
    \input{理论分析.tex}
    \input{软件实现.tex}
    \appendix
    \include{源代码.tex}
    \input{测试数据.tex}
\end{document}
    \end{lstlisting}
    }
\end{tabular}

\subsection{编写自己的宏包}

\LaTeX 宏包并不神秘，它就是一个后缀名为\verb|.sty|的普通文本文件。宏包里面包含了若干条命令，当你在文档中引入一个宏包时，就相当于在导言区插入了这些命令。上文提到的\verb|ctex|、\verb|amsmath|等宏包就位于你安装的\LaTeX 发行版的安装目录的某处，你完全可以用文本编辑器打开它们查看其中的内容。在使用\verb|\usepackage{<宏包>}|引入一个宏包时，你可以指定一个你的\LaTeX 发行版所安装的宏包，如\verb|ctex|、\verb|amsmath|，也可以通过绝对路径或相对路径指定你自己编写的宏包。\footnote{不带扩展名``.sty''。路径分隔符应当使用``/''。}

多数可以写在导言区的命令都可以写在宏包里。但需要注意的一点是，如果需要在自己编写的宏包中引入其他宏包，应当使用``\verb|\RequirePackage|''代替``\verb|\usepackage|''。两者的区别在于，``\verb|\RequirePackage|''会避免重复引入一个宏包多次，而``\verb|\usepackage|''不会。以下是自己编写的一个宏包的示例：你也许认为\LaTeX 默认的页边距太大了，想要自己设定页边距，那么你可以编写这样一个宏包，并在你的文档中引入它。这个宏包的第一行声明了这是一个名为\verb|mymargin|的宏包，之后的内容则使用\verb|geometry|宏包提供的命令设定了页边距。

\begin{tabular}{cc}
 你的宏包\textit{mymargin.sty} & 你的\LaTeX 文档 \\
{
\small
\ttfamily
\begin{lstlisting}[language=Tex]
\ProvidesPackage{mymargin}
\RequirePackage{geometry}
\geometry{
    includehead, includefoot,
    left=30mm,right=25mm,
    top=26mm,bottom=20mm,
    headheight=7mm,footskip=7mm
}
\end{lstlisting}
} &
{
\small
\ttfamily
\begin{lstlisting}[language=Tex]
\documentclass{article}
\usepackage{mymargin}
% <文本><文本>
\begin{document}
% <文本><文本>
\end{document}
\end{lstlisting}
}
\end{tabular}

\subsection{使用include与input命令}

使用\verb|\include{<文件名>}|和\verb|\input{<文件名>}|命令可以插入另一个源文件中的内容。两个命令的区别是\verb|\include|会另起一页，然后再插入指定的内容，而\verb|\input|不会另起一页。\verb|\include|与\verb|\input|的最佳用法是将文档的框架结构写在一个主文件中，然后在这个主文件中使用这两个命令插入各个章节的内容。对于设定文档全局格式或多个章节格式的命令，则最好不要通过\verb|\include|与\verb|\input|插入。这些内容最好写在宏包里，如果不方便写在宏包里，则最好写在主文件中。

\section{设定字体与页面格式}

\LaTeX 中关于排版样式设定的知识繁多而复杂，本小节仅作为对lshort中“排版样式设定”一章的补充，而不是较为完整的介绍。建议阅读lshort原文，必要时可以查阅相关宏包的文档。关于字体与页眉页脚的部分，为了本章的连贯性，部分引用了lshort的内容。

\subsection{字体与行距}

%TODO LaTeX中的长度单位
毕业论文一般会对字体与页面的格式有所要求，例如字号、行距、边距、页眉页脚等。\LaTeX 提供了一系列长度单位，见表\ref{sizes}，可以用于设定各个元素的尺寸、间距等。

\begin{table}
\centering
\noindent
\caption{\LaTeX 的常用长度单位}
\label{sizes}
\begin{tabular}{cl}
    \hline
    pt & 点阵宽度,1/72.27in \\
    bp & 点阵宽度,1/72in \\
    in & 英寸 \\
    cm & 厘米 \\
    mm & 毫米 \\
    \hline
    em & 当前字号下大写字母 M 的宽度,常用于水平距离的设定 \\
    ex & 当前字号下小写字母 x 的高度,常用于垂直距离的设定 \\
    textwidth & 当前上下文文本内容的宽度 \\
    \hline
\end{tabular}
\end{table}

使用\verb|\fontsize{<尺寸>}{<行距>}|来设定字体大小。如果不是在导言区,\verb|\fontsize|的设定需要\verb|\selectfont|命令才能立即生效。然而，中文用户大多习惯使用字号来指定字体大小，而非点数，论文格式要求中也大多指定字号。为此，\verb|ctex|宏包提供了\verb|zihao{<字号>}|命令，用法与其他设定格式的命令类似。

{
\centering
\noindent
\newline
\begin{tabular}{cc}
    \begin{minipage}{0.48\textwidth}
        \begin{verbatim}
        \zihao{4}  四号
        \zihao{-4} 小四号
        \zihao{5}  五号
        \zihao{-5} 小五号
        \end{verbatim}
    \end{minipage} &
    \begin{minipage}{0.48\textwidth}
        \zihao{4}  四号
        \zihao{-4} 小四号
        \zihao{5}  五号
        \zihao{-5} 小五号
    \end{minipage}
\end{tabular}
}

在\LaTeX 中，可以通过\verb|\linespread{<行距>}|来设定行距大小。如果不是在导言区,\verb|\linespread|的设定同样需要\verb|\selectfont|命令才能立即生效。需要注意的是，\LaTeX 的基础行距是文字高度的1.2倍，而Word的基础行距为文字高度的1.3倍。因此，如果你的论文排版要求是基于Word给出的，那么要将其乘以$\frac{13}{12}$以得到在\LaTeX 中的行距。例如想要达到Word中1.5倍行距的结果，需要使用\verb|\linespread{1.625}|。

\begin{table}
    \centering
    \noindent
    \newline
    \caption{字体命令}
    \label{cmd_fonts}
    \begin{tabular}{ll|ll}
        \hline
        \multicolumn{2}{c|}{命令} & \multicolumn{2}{|c}{效果} \\
        \hline
        \verb|\rmfamily| & \verb|\textrm{<文本>}| & \textrm{roman} & \textrm{衬线字体(罗马体)} \\
        \verb|\sffamily| & \verb|\textsf{<文本>}| & \textsf{sans serif} & \textsf{无衬线字体} \\
        \verb|\ttfamily| & \verb|\texttt{<文本>}| & \texttt{typewriter} & \texttt{等宽字体} \\
        \verb|\bfseries| & \verb|\textbf{<文本>}| & \textbf{bold face} & \textbf{粗体} \\
        \verb|\itshape| & \verb|\textit{<文本>}| & \textit{italic} & \textit{意大利斜体} \\
        \verb|\slshape| & \verb|\textsl{<文本>}| & \textsl{slanted} & \textsl{倾斜体} \\
        \verb|\normalfont| & \verb|\textnormal{<文本>}| & normal font & 默认字体 \\
        \hline
    \end{tabular}

\end{table}

\LaTeX 提供了表\ref{cmd_fonts}中的命令来设定字体样式。表中第一列的作用是设定下文字体格式，第二列的作用是插入一段指定格式的文本。在毕业论文中，最常见的对字体样式的要求为某些地方使用宋体，另一些地方使用黑体，并对部分文档元素加粗。宋体基本上对应了表\ref{cmd_fonts}中的有衬线字体，而黑体基本上对应了表\ref{cmd_fonts}中的无衬线字体。而\verb|ctex|则提供了\verb|\songti|命令和\verb|\heiti|命令分别用来将字体设定为宋体或黑体。

简单粗暴，行之有效。

\subsection{页眉页脚}

在\LaTeX 中，页眉页脚的格式可以使用\verb|fancyhdr|宏包轻松完成设定。该宏包提供了\verb|\fancypagestyle{<样式名称>}{<样式内容>}|命令，该命令需要写在导言区，用于创建自定义的页眉页脚样式，然后就可以在正文中使用\verb|\pagestyle{<样式名称>}|命令应用你创建的样式。使用\verb|fancyhdr|创建并设定页眉页脚样式的示例如下：

{
\small
\ttfamily
\begin{lstlisting}[language=Tex,frame=single]
% ......
\fancyhf{}
\fancypagestyle{mainmatter}{
    \fancyhead[CO]{\zihao{-5}本科生毕业设计(论文)}
    \fancyfoot[CO]{\zihao{-5}-\ \thepage\ -}
    \fancyhead[CE]{\zihao{-5}本科生毕业设计(论文)}
    \fancyfoot[CE]{\zihao{-5}-\ \thepage\ -}
}
\fancypagestyle{frontmatter}{
    \fancyhead[CO]{本科生毕业设计(论文)}
    \fancyhead[CE]{本科生毕业设计(论文)}
}
\renewcommand{\headrulewidth}{0.4pt}
\renewcommand{\footrulewidth}{0pt}
% ......
\begin{document}
% ......
\pagestyle{frontmatter}
% ......
\pagestyle{mainmatter}
% ......
\end{document}

\end{lstlisting}
}

\verb|\fancyhf{}|用于清空预设的页眉页脚样式，没有这条命令，你的页眉页脚会变成预设样式与自定义样式的叠加。\verb|\fancyhead[<位置>]{<内容>}|设定页眉样式；\verb|\fancyfoot[<位置>]{<内容>}|设定页脚样式。页眉页脚分为左中右三栏，奇偶数页的格式分别设定。\verb|[CO]|中的“C”表示页眉/页脚的居中栏，与之类似“L”表示左栏，“R”表示右栏；“O”表示奇数页，同理，“E”表示偶数页。\verb|\thepage|则用于插入页码。\verb|\headrulewidth|和\verb|\headrulewidth|则分别设置页眉、页脚的分隔线粗细，在上面的示例中，页眉分隔线为0.4磅；页脚分隔线为0磅，也就是没有页脚分隔线。

在论文中往往需要在不同的部分，本别使用罗马数字、阿拉伯数字等不同格式标注页码，此时可以使用\verb|\pagenumbering{<样式>}|。其中样式可取值如下：
\begin{itemize}
 \item arabic, 阿拉伯数字
 \item roman, 小写罗马数字
 \item Roman,大写罗马数字
 \item alpha, 小写拉丁字母
 \item Alpha, 大写拉丁字母
\end{itemize}
有时候论文会要求正文的页码重新从1开始，这可以正文开始处插入一条\verb|\setcounter{page}{1}|命令实现。如果对页眉页脚和页码的设定没有立即生效，可以在它们前面加一个\verb|\newpage|。

{
\small
\ttfamily
\begin{lstlisting}[language=Tex,frame=single]
\newpage
\pagestyle{mainmatter}
\setcounter{page}{1}
\pagenumbering{roman}
\input{摘要.tex}
\end{lstlisting}
}

\section{使用\LaTeX 制作论文封面}

对于\LaTeX 来说，排版论文封面之类的内容的确是一大难点。毕竟，一篇用\LaTeX 书写的文档最终效果长什么样子，不总是写它的人说了算的，往往还要看编译器的自由发挥。下面就讲解一些在\LaTeX 中制作论文、报告封面的技巧。

\LaTeX 提供了\verb|titlepage|环境，用于制作论文、书籍等的封面。\verb|titlepage|中的内容会单独成页，并且这一页的页眉与页脚是空白的。

毕业论文的封面往往需要像下面这样注明论文的题目、作者等信息。这时候如果直接排版，很难保证各个部分可以完美对齐。此时可以使用tabular排版这些内容。而各个字段内容的下划线则可以使用\verb|\cline|实现。 \newline

\begin{center}
\begin{tabular}{lcll}
学院（部） & \multicolumn{3}{c}{\textsf{枫丹科学院动力与能源学院}} \\ \cline{2-4}
题目 & \multicolumn{3}{c}{\textsf{芒荒湮灭能量在发条机关中的应用}} \\ \cline{2-4}
姓名 & \multicolumn{1}{l}{\textsf{阿兰·吉约丹}} & 学号 & \textsf{ME04256} \\ \cline{2-2} \cline{4-4}
论文提交日期 & \multicolumn{3}{c}{\textsf{2023年6月1日}} \\ \cline{2-4}
\end{tabular}
\end{center}

{
\tiny
\ttfamily
\begin{lstlisting}[frame=single,language=TeX]
\begin{center}
\begin{tabular}{lcll}
学院（部） & \multicolumn{3}{c}{\textsf{枫丹科学院动力与能源学院}} \\ \cline{2-4}
题目 & \multicolumn{3}{c}{\textsf{芒荒湮灭能量在发条机关中的应用}} \\ \cline{2-4}
姓名 & \multicolumn{1}{l}{\textsf{阿兰·吉约丹}} & 学号 & \textsf{ME04256} \\ \cline{2-2} \cline{4-4}
论文提交日期 & \multicolumn{3}{c}{\textsf{2023年6月1日}} \\ \cline{2-4}
\end{tabular}
\end{center}
\end{lstlisting}
}

这个排版技巧同样适用于其他很多较为刁钻的布局：\newline

{
\bfseries
\centering
\noindent
\begin{tabular}{lllllll}
 & 涉密论文$\square$ & & & & & \\
本论文属 & & 在 & \hspace{3ex} & 年 & \hspace{1ex} & 月解密后适用本规定。 \\ \cline{4-4} \cline{6-6}
 & 非涉密论文$\square$\hspace{-2ex}$\surd$ & & & & &
\end{tabular}
} \newline

{
\tiny
\ttfamily
\begin{lstlisting}[frame=single,language=TeX]
\begin{tabular}{lllllll}
 & 涉密论文$\square$ & & & & & \\
本论文属 & & 在 & \hspace{3ex} & 年 & \hspace{1ex} & 月解密后适用本规定。 \\ \cline{4-4} \cline{6-6}
 & 非涉密论文$\square$\hspace{-2ex}$\surd$ & & & & &
\end{tabular}
\end{lstlisting}
}

在这里，\verb|\hspace|的作用是插入一个指定长度的横向间隔。上面的例子既使用了长度为正的横向间隔赋予表格中的空单元格一定的宽度，也使用了长度为负的横向间隔使勾号与方框重合。同理，使用\verb|\hspace{<大小>}|可以插入一个纵向的间隔。在论文封面，你或许需要手动控制校徽、论文信息等纵向排布的元素的间隔，此时\verb|\hspace{<大小>}|是一个很好的选择。

即使你在使用Word，使用无边框的表格排版封面也是一个实用技巧。它可以有效避免Word最令人诟病的缺点：在另一台设备上打开同样的文档，排版就乱掉了。

\section{设置目录与图表的格式}

毕业论文通常对章节标题、图表标题与目录的格式有所要求，本小节会分别给出相关的示例。

如果你使用的是\verb|ctexrep|等由\verb|ctex|宏包提供的文章类型，那么可以用该宏包提供的\verb|\ctexset|命令在导言区设定文章的章节标题格式，示例如下：

{
\small
\ttfamily
\begin{lstlisting}[frame=single,language=TeX]
\ctexset{
    % 设定章标题格式
    chapter = {
        % 小三号，粗体，居中
        format = \zihao{-3} \bfseries \centering,
        % 默认情况下，ctexrep每一章的第一页没有页眉页脚
        % 在这里指定一种页面样式
        % 可以是预设的也可以是用\fancypagestyle自定义的
        % 即可为这一页加上页眉页脚
        pagestyle = mainmatter,
        % 标题上方空行的高度
        beforeskip = 0ex,
        % 标题下方空行的高度
        afterskip = 2ex,
    },
    % 设定节标题格式
    section = {
        format = \zihao{-3} \bfseries,
    },
    % 设定小节标题格式
    subsection = {
        format = \zihao{-3} \bfseries,
    },
    % 设定小小节标题格式
    subsubsection = {
        format = \zihao{-3} \bfseries,
    }
}
\end{lstlisting}
}

如果需要设定目录中的章节标题格式，则可以使用\verb|\titlecontents|命令。该命令由宏包\verb|titletoc|提供。以下仅提供最简单的示例，详细说明见该宏包的文档。

{
\small
\ttfamily
\begin{lstlisting}[frame=single,language=TeX]
% 设定章标题格式，左侧缩进0em（不缩进），四号黑体
% 使用点号连接章标题与之后的页码
\titlecontents{chapter}[0em]{\sffamily\zihao{4}}
    {\thecontentslabel}{}{\titlerule*{·}\contentspage}
% 设定节标题格式，左侧缩进2em，四号宋体
\titlecontents{section}[2em]{\rmfamily\zihao{4}}
    {\thecontentslabel}{}{\titlerule*{·}\contentspage}
% 设定小节标题格式，用法同上
\titlecontents{subsection}[4em]{\rmfamily\zihao{4}}
    {\thecontentslabel}{}{\titlerule*{·}\contentspage}
\end{lstlisting}
}

如果需要修改“目录”两个字的格式，或将其替换为其他字样，则需要重新定义\verb|\contentsname|命令：

{
\small
\ttfamily
\begin{lstlisting}[frame=single,language=TeX]
% “目录”两个字用四号宋体
\renewcommand{\contentsname}{{\zihao{4}\textrm{目\ 录}}}
\end{lstlisting}
}

图表标题的格式可以用\verb|caption|宏包提供的\verb|\captionsetup[<类型>]{<选项>}| 命令设定。类似于定制目录标题，图表编号的内容可以通过重新定义命令\verb|\thefigure| 和命令\verb|\thecaption|的方式进行定制。以下仅提供最简单的示例，详细说明见该宏包的文档。

{
\small
\ttfamily
\begin{lstlisting}[frame=single,language=TeX]
% 图表标题使用常规样式，图表编号与图表标题的分割符为空格
\captionsetup[figure]{labelformat=simple, labelsep=quad}
\captionsetup[table]{labelformat=simple, labelsep=quad}
% 图表标号采用类似“图1-1”的格式
% `\thechapter{}`插入当前章的编号
% `\arabic{figure}`以阿拉伯数字的形式插入当前图表的编号
\renewcommand {\thetable} {\thechapter{}-\arabic{table}}
\renewcommand {\thefigure} {\thechapter{}-\arabic{figure}}
\end{lstlisting}
}
